package main

import (
	"bufio"
	"fmt"
	"os"
	"sync"
	"time"
)

func transferData(wg *sync.WaitGroup, direction string) {
	defer wg.Done()
	for {
		// sleep
		fmt.Println("running " + direction)
		time.Sleep(3 * time.Second)
	}
}

func main() {
	// 创建两个模拟的连接 (可以用真实的网络连接替换)
	// clientConn, remoteConn := net.Pipe()

	// 用于同步的 WaitGroup
	var wg sync.WaitGroup

	// 关闭信号通道
	closeChan := make(chan struct{})

	// 启动数据传输协程
	wg.Add(1)
	go func() {
		select {
		case <-closeChan:
			// 如果另一个方向已经关闭，则直接退出
			fmt.Println("Close signal received, exiting.")
			wg.Done()
			return
		default:
			transferData(&wg, "server -> client")
		}
	}()

	// 模拟在另一个协程中读取文件内容并决定是否关闭 closeChan
	go func() {
	out:
		for {

			file, err := os.Open("control.txt") // 打开控制文件
			if err != nil {
				fmt.Println("Failed to open file:", err)
				return
			}
			defer file.Close()

			scanner := bufio.NewScanner(file)
			for scanner.Scan() {
				line := scanner.Text()
				fmt.Println("Read from file:", line)
				if line == "close" {
					fmt.Println("Closing signal triggered.")
					close(closeChan) // 关闭信号通道
					break out
				}
				fmt.Println("line content:" + line)
			}

			if err := scanner.Err(); err != nil {
				fmt.Println("Error reading file:", err)
			}

			time.Sleep(5 * time.Second) // 模拟读取文件需要一些时间

		}
	}()

	// 等待所有任务完成
	wg.Wait()
	fmt.Println("All tasks completed.")
}
